﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Noris.Tools.TraceVisualiser.Interface;
using Noris.Tools.TraceVisualiser.TraceData;
using Noris.Tools.TraceVisualiser.Support;
using Noris.Tools.TraceVisualiser.Components;
using Noris.Tools.TraceVisualiser.Forms;

namespace Noris.Tools.TraceVisualiser.Green
{
    public class Func_Copy : Func_Base, IFunctionGlobalProvider
    {
        #region IPlugin Members
        bool IPlugin.Active { get { return true; } }
        #endregion
        #region IFunctionGlobalProvider Members
        void IFunctionGlobalProvider.CreateMenuItems(FunctionGlobalDeclareArgs args)
        {
            args.MenuItems.Add(new FunctionMenuItem(20, "Copy", "Kopíruje události do schránky.\r\nKopíruje události vybrané (pokud jsou vybrány), anebo všechny načtené, nejvýše 100,000 řádků.\r\nZe schránky je lze vložit (Ctrl+V) například do Excelu.", false, Pics.PicLibrary16.EditCopy_FromFile, Pics.PicLibrary22.EditCopy_FromFile));
        }
        void IFunctionGlobalProvider.Run(FunctionGlobalRunArgs args)
        {
            List<IEventItem> selectedEvents = this.GetInputEvents(args);
            this.CopyEventsToClipboard(selectedEvents, null);
        }
        #endregion
        #region Kopírování dat o událostech do výstupu
        protected void CopyEventsToClipboard(List<IEventItem> eventItems, Func<IEventItem, bool> filter)
        {
            string result = null;
            using (DataMatrix matrix = new DataMatrix())
            {
                foreach (IEventItem eventItem in eventItems)
                {
                    bool add = (filter == null || (filter != null && filter(eventItem)));
                    if (!add) continue;

                    if (eventItem is IDataMatrixRow)
                        matrix.AddRow((IDataMatrixRow)(eventItem as IDataMatrixRow));
                    else if (eventItem is IMasterDetails)
                        matrix.AddRow((IMasterDetails)(eventItem as IMasterDetails));
                }
                if (matrix.ContainData)
                    result = matrix.GetTable();
            }
            if (result != null)
            {
                System.Windows.Forms.Clipboard.SetText(result);
                Steward.TrayShowTip("Informace o vybraných prvcích jsou uloženy do schránky.", "TraceVisualiser", System.Windows.Forms.ToolTipIcon.Info);
                // Dialog.ShowInfo("Informace o vybraných prvcích jsou uloženy do schránky.");
            }
            else
            {
                Dialog.ShowWarning("Nejsou vybrány žádné prvky, které by bylo možno uložit do schránky.");
            }
        }
        #endregion
    }
}
